﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionContrato;
using ClickLand.CorporacionPlaza.Presentacion.Controladores;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Utilidades;
using ClickLand.Web.UI.WebControls;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionContrato
{
    /// <summary> Clase que hace de presentador para la vista que se encarga de agregar contrato </summary>
    public class PresentadorAgregarContrato:PresentadorBase
    {
        #region Atributos

        /// <summary> Propiedad de la vista </summary>
        private readonly IAgregarContrato _vista;


        /// <summary> Variable que posee la definicion del controlador </summary>
        private readonly ControladorAdministracionContrato _controladorContrato;


        /// <summary> Variable que posee la definicion del controlador de clientes  </summary>
        private readonly ControladorAdministracionCliente _controladorCliente;


        /// <summary> Variable que posee la definicion del controlador de clientes  </summary>
        private readonly ControladorAdministracionEstablecimiento _controladorEstablecimiento;
            
            
        #endregion

        #region Constructor

        /// <summary> Constructor de la clase </summary>
        /// <param name="vista">Definicion de las propiedades de la vista</param>
        public PresentadorAgregarContrato(IAgregarContrato vista)
        {
            _vista = vista;
            _controladorContrato = new ControladorAdministracionContrato();
            _controladorCliente = new ControladorAdministracionCliente();
            _controladorEstablecimiento = new ControladorAdministracionEstablecimiento();
        }

        #endregion

        #region Metodos


        /// <summary> Metodo que se encarga de las operaciones cuando se carga la pagina </summary>
        public void CargarPagina()
        {
            CargarListaSinValor(_vista.TipoDocumento, "letraRifNatural", true);
            CargarListaConValor(_vista.TipoFirma, "tipoFirmasValor", true);
            CargarClientes();
            CargarClientesRenovacion();

        }


        private void CargarClientesRenovacion()
        {
            var contrato = new ContratoDto { Estado = (int)Estados.Activo };
            List<ContratoDto> lista = _controladorContrato.BuscarContrato(contrato);

            HttpContext.Current.Session["listaContratos"] = lista; 
            _vista.ClientesRenovacion.DataSource = lista;
            _vista.ClientesRenovacion.DataTextField = "RazonSocial";
            _vista.ClientesRenovacion.DataValueField = "Id";
            _vista.ClientesRenovacion.DataBind();
        }


        /// <summary> Metodo que se encarga de las operaciones cuando se selecciona untipo de cliente del fiador </summary>
        public void SeleccionarTipoCliente()
        {

        }



        /// <summary> Metodo que se encarga de cargar la lista de clientes </summary>
        private void CargarClientes()
        {
            var cliente = new ClienteDto ();
            _vista.ListaCliente = _controladorCliente.ConsultarCliente(cliente);
            _vista.Clientes.DataSource = _vista.ListaCliente;
            _vista.Clientes.DataTextField = "Nombre";
            _vista.Clientes.DataValueField = "Id";
            _vista.Clientes.DataBind();
        }
        

        /// <summary> Metodo que realiza las operaciones para mostrar la informacion del contrato en la confirmacion </summary>
        public void MostrarConfirmacion()
        {
            var contrato = ObtenerContrato();
            _vista.NombreClienteConfirmacion = contrato.Cliente.Nombre;
            _vista.EstablecimientoConfirmacion = contrato.Establecimiento.Numero;
            _vista.TipoFirmaConfirmacion = contrato.TipoFirma;
            _vista.PorcentajeConfirmacion = contrato.PorcentajeVenta.ToString("N") + "%";
            _vista.NombreComercialConfirmacion = contrato.NombreComercial;
            _vista.NombreFirmanteConfirmacion = contrato.NombreFirmante;
            int tipoFirmaSeleccionado = Convert.ToInt32(_vista.TipoFirma.SelectedValue);
            _vista.HayOtrosFirmantesConfirmacion = tipoFirmaSeleccionado == 2;

            if (tipoFirmaSeleccionado == 2)
            {
                _vista.NombreFirmante2Confirmacion = contrato.NombreFirmante2;
                _vista.NombreFirmante3Confirmacion = contrato.NombreFirmante3;
            }
            _vista.FechaInicioConfirmacion = contrato.FechaInicio.GetValueOrDefault().ToString("dd/MM/yyyy");
            _vista.FechaFinConfirmacion = contrato.FechaFin.ToString("dd/MM/yyyy");
            _vista.ListaCanonConfirmacion = contrato.Pension.ContratoPensiones;
            _vista.TipoIncrementoConfirmacion = contrato.Pension.Tipo == "0" ? "Simple":"Personalizado";
            _vista.FiadorConfirmacion = contrato.Fiadores;
            _vista.PolizaConfirmacion = contrato.Polizas;
            _vista.MontoGarantiaConfirmacion = contrato.MontoGarantia.ToString("N") + " BsF.";

        }


        /// <summary> Metodo que realiza las acciones para agregar los datos de la poliza </summary>
        public bool AgregarContrato()
        {
            if(!_vista.Nuevo)
            {
                ContratoDto contrato = _vista.Contrato;
                contrato.Estado = 0;
                _controladorContrato.AgregarContrato(contrato);
                _vista.Contrato.Id = 0;
                _vista.Contrato.Estado = (int)Estados.Activo;
            }

            return _controladorContrato.AgregarContrato(ObtenerContrato());
        }


        /// <summary> Metodo que obtiene la lista de la pension seleccionada </summary>
        /// <returns></returns>
        public List<ContratoPensionDto> ObtenerListaPension()
        {
            var lista = new List<ContratoPensionDto>();
            if (_vista.TipoPension == 0)
            {
                var obj = new ContratoPensionDto();
                obj.FechaInicio = (_vista.Nuevo)? _vista.FechaInicioContrato: Convert.ToDateTime(_vista.FechaInicioContratoRenovacion);
                obj.FechaFin = (_vista.Nuevo) ? _vista.FechaFinContrato : _vista.FechaFinContratoRenovacion;
                obj.Monto = Convert.ToSingle( _vista.MontoCanon);
                obj.Porcentaje = 0;
                obj.Estado = 1;
                lista.Add(obj);
            }
            else
                foreach (GridViewRow row in _vista.ListaCanon.Rows)
                {
                    var obj = new ContratoPensionDto();
                    obj.FechaInicio = Convert.ToDateTime(((ClickLandExTextBox) row.FindControl("tbFechaInicio")).Text);
                    obj.FechaFin = Convert.ToDateTime(((ClickLandExTextBox) row.FindControl("tbFechaFin")).Text);
                    obj.Monto = Convert.ToSingle(((ClickLandExTextBox) row.FindControl("tbMontoCanon")).Text);
                    obj.Porcentaje = Convert.ToSingle(((ClickLandExTextBox) row.FindControl("tbMontoPorcentaje")).Text);
                    obj.Estado = 1;
                    lista.Add(obj);
                }
            return lista;
        }


        public List<ContratoPensionDto> ObtenerProyeccion()
        {
            var retorno = new   List<ContratoPensionDto>();
            var lista = _controladorContrato.ConsultarProyeccion(_vista.Contrato);
            foreach (var dto in lista)
            {
                if (_vista.Contrato.FechaInicio > dto.FechaFin && _vista.Contrato.FechaFin < dto.FechaFin) continue;
                var obj = new ContratoPensionDto();
                obj.FechaInicio = dto.FechaInicio;
                obj.FechaFin = dto.FechaFin;
                obj.Monto = dto.Monto;
                obj.Porcentaje = dto.Porcentaje;
                obj.Estado = 1;
                retorno.Add(obj);
            }
            return retorno;
        } 

        /// <summary> Metodo que obtiene la informacion requerida para armar el objeto contrato </summary>
        /// <returns>Objeto Contrato Armado</returns>
        /// <remarks>Almacena la info en una variable de session</remarks>
        private ContratoDto ObtenerContrato()
        {

            ContratoDto contrato;
            if(_vista.Nuevo && _vista.Contrato != null) return _vista.Contrato;

            if (_vista.Nuevo)
            {
                contrato = new ContratoDto();
                contrato.FechaInicio = _vista.FechaInicioContrato;
                contrato.FechaFin = _vista.FechaFinContrato;
                contrato.Cliente = _vista.ListaCliente[_vista.Clientes.SelectedIndex - 1];
                contrato.PorcentajeVenta = Convert.ToSingle(_vista.PorcentajeVenta);
                contrato.Establecimiento = new EstablecimientoDto();
                contrato.Establecimiento.Id = Convert.ToInt64(_vista.Establecimientos.SelectedValue);
                contrato.Establecimiento.Numero = _vista.Establecimientos.SelectedItem.Text;
                contrato.TipoFirma = _vista.TipoFirma.SelectedItem.Text;
                contrato.NombreFirmante = _vista.NombreFirmante;

                int tipoFirmaSeleccionado = Convert.ToInt32(_vista.TipoFirma.SelectedValue);
                if (tipoFirmaSeleccionado == 2)
                {
                    contrato.NombreFirmante2 = _vista.NombreFirmante2;
                    contrato.NombreFirmante3 = _vista.NombreFirmante3;
                }
                else
                {
                    contrato.NombreFirmante2 = string.Empty;
                    contrato.NombreFirmante3 = string.Empty;
                }

                contrato.NombreComercial = _vista.NombreComercial;
                contrato.Estado = 1;
            }
            else
            {
                contrato = _vista.Contrato;
                contrato.FechaInicio = Convert.ToDateTime(_vista.FechaInicioContratoRenovacion);
                contrato.FechaFin = Convert.ToDateTime(_vista.FechaFinContratoRenovacion);
            }
            if (_vista.GarantiaFiador)
            {
                var fiador = new FiadorDto();
                fiador.Nombre = _vista.NombreFiador;
                fiador.Correo = _vista.CorreoFiador;
                fiador.Telefono = _vista.NumeroTelefonoFiador;
                fiador.Cedula = _vista.CedulaFiador;
                fiador.Estado = 1;
                contrato.Fiadores = new FiadorDto[1];
                contrato.Fiadores[0] = fiador;
            }
            else contrato.MontoGarantia = Convert.ToDouble(_vista.MontoGaranta);

            if (!string.IsNullOrEmpty(_vista.EmpresaAsegurador))
            {
                var poliza = new PolizaDto();
                poliza.Aseguradora = _vista.EmpresaAsegurador;
                poliza.Beneficiario = _vista.NombreBeneficiarioPoliza;
                poliza.FechaEmision = _vista.FechaEmisionPoliza;
                poliza.FechaFin = _vista.FechaVencimientoPoliza;
                poliza.Monto = Convert.ToSingle(_vista.MontoPoliza);
                poliza.Estado = 1;
                contrato.Polizas = new PolizaDto[1];
                contrato.Polizas[0] = poliza;
            }

            contrato.Pension = new PensionDto();
            contrato.Pension.Estado = 1;
            contrato.Pension.Periodo = _vista.Periodo;
            contrato.Pension.Tipo = _vista.TipoPension.ToString(CultureInfo.InvariantCulture);
            contrato.Pension.ContratoPensiones = ObtenerListaPension().ToArray();
            contrato.Garantia = new GarantiaDto {Id = 1};
            contrato.Cliente.Estado = 1;
            _vista.Contrato = contrato;
            return contrato;
        }

        public void ContratoSeleccionado()
        {
            if (_vista.ClientesRenovacion.SelectedIndex != 0)
            {
                List<ContratoDto> lista = (List<ContratoDto>) HttpContext.Current.Session["listaContratos"];
                int id = Convert.ToInt32(_vista.ClientesRenovacion.SelectedItem.Value);
                _vista.Contrato = (from objeto in lista
                                   where objeto.Id == id
                                   select objeto).First();

                _vista.FechaInicioContratoRenovacion = _vista.Contrato.FechaFin.ToString("dd/MM/yyyy");
            }
        }


        /// <summary> Metodo que se encarga de cargar los establecimientos libres en la fecha seleccionada </summary>
        public void CargarEstablecimientos()
        {
            _vista.Establecimientos.Items.Clear();
            _vista.Establecimientos.Items.Add(new ListItem(ConfigurationManager.AppSettings[@"Seleccione"], "-1"));
            
            _vista.Establecimientos.DataSource = _controladorEstablecimiento.ConsultarEstablecimientosLibres(_vista.FechaInicioContrato,_vista.FechaFinContrato);
            _vista.Establecimientos.DataTextField = "NombreExtendido";
            _vista.Establecimientos.DataValueField = "Id";
            _vista.Establecimientos.DataBind();
        }


        #endregion

        public float ObtenerMontoFinal()
        {
            DateTime? max = null;
            float monto = 0;
            foreach (var dto in _vista.Contrato.Pension.ContratoPensiones)
            {
                if (max != null && max >= dto.FechaFin) continue;
                max = dto.FechaFin;
                monto = dto.Monto;
            }
            return monto;
        }
    }
}
